パソコン活用研究PCマニアックの道(アセンブラ、DOS、Windows、旧型PCの活用研究)
プログラムの記述様式と画面入出力と計算
まずは、cobolプログラムの第一歩として、プログラムの記述様式と、画面入出力(Basicのinput,
print)
そして、四則演算についてまとめてみました。
1 記述様式
cobolはFortranと同じく、プログラムの記述様式がかなり厳密に定められており、いわゆる古く正しい
Cobolの記述様式(正書法というらしい)は、結構堅苦しいです。
正書法ではFortran同様、1行の中の書き方に以下のようなうるさい決まりがあります。
1-6桁 一連番号領域 プログラムの行を書く
7 識別領域 * を書くと注釈行とみなされる
- を書くと前の行からの継続行とみなされる
8-11 A領域 部、節、段落の見出し、レベル番号01
12- B領域 その他
正書法はかなり堅苦しくて、これだけでCobolを投げ出したくなりますが、パソコン用のCobolは、かなり
自由度が高いものが多いようです。Tiny Cobolは記述様式は自由で1桁目から記述していいので、
今回はTiny Cobolを使って説明します。
Cobolは以下の4つの部(Division)を必ずプログラムに書かなければなりません。これもBasicなんかに
比べると、面倒な規則ですが我慢してください。書かないとコンパイルしてくれませんので。
・見出し部 IDENTIICATION DIVISION. プログラムの見出し的なものを書くパートです
・環境部 ENVIRONMENT DIVISION. プログラムが使用するコンピューターや入出力装置について書きます。
・データ部 DATA DIVISION. 変数の宣言をするパートと考えてください。
・手続き部 PROCEDURE DIVISION. ここにコードを書きます。
ちょっとしちめんどくさそうですが、Tiny Cobolでは見出し部と環境部は何も書かなくてもかまいません。
まあ、Basicでも冒頭のコメント行に作者や、何のプログラムかの説明や、制作日などを記述しますが、
見出し部や環境部はそういったものです。
データ部は、変数等を宣言する部分です。C言語はじめ多くの言語で、変数は最初に宣言しないと
いけないはずです。Cobolだけが面倒なわけではないので、我慢してください。
(1) 見出し部 IDENTIICATION DIVISION.
見出し部には、プログラム名、作者、制作日などを記述します。もちろん省略してもかまいません。
以下に一例を示します。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE01. AUTHOR. T.K.asai DATE-WRITTEN. Dec 20, 1999. |
(2) 環境部 ENVIRONMENT DIVISION.
環境部には、プログラムの使用するコンピューターの機械的な特徴を記述します。
環境部は構成節 CONFIGURATION SECTION. と入出力節 INPUT-OUTPUT SECTION.
とからなります。
CONFIGURATION SECTION. の中で、よく記述するのはSPECIAL-NAMES. という項目で、
ここに入出力が画面からの入出力であることを示す CONSOLE IS CRT という記述をすることが
多いと思います(というかほとんど必ずする)
INPUT-OUTPUT SECTION.では、そのプログラムが使用する入出力装置を指定します。今回は説明を
割愛して、記述する必要のある時に説明を加えたいと思います。
(3) データ部 DATA DIVISION
データ部は、一般的な言語でいうところの変数の宣言をするパートと言ってもいいでしょう。
ここだけは、省略できません。COBOLは使う変数の型と桁数を必ず宣言しなければなりません。
(ああ、めんど)
データ部は
ファイル節 FILE SECTION. 作業場所節 WORKING-STORAGE SECTION. 連絡節 LINKAGE
SECTION.
通信節 COMUNICATION SECTION. からなります。
ファイル節FILE SECTION.は、入出力するファイル(=データ)を定義します。ファイルといってますが、
他の一般的な言語でいうと変数です。
作業場所節も、他の言語でいうと変数を定義する場所ですが、ここは入出力に関わらない変数を
定義します。すなわち、計算結果を保持するための変数とかです。
ということで、COBOLはこのデータの宣言が結構面倒です。あっもうだめ、て言う人も多いかもしれません。
では、作業場所節WORKING-STRAGE SECTION.の記述の仕方を説明します。
COBOLではデータを階層構造をもったデータとして扱えます。C言語でいうと構造体変数のイメージに
近いですが、文法の仕様が違うので、同類の機能とは言えないですね。
わかりにくいので、学校の職員数のデータを考えてみます。
データ階層構造 | COBOLでの記述 |
学校職員 | |−先生 | |−−男の先生数 | |−−女の先生数 | |−事務職員 | |−−男の事務職員数 | |−−女の事務職員数 | |−生徒 | |−−男子生徒数 | |−−女子生徒数 |
WORKING-STORAGE SECTION. 01 学校職員. 02 先生. 03 男の先生 PIC 9(5) VALUE 11. 03 女の先生 PIC 9(5) VALUE 9. 02 事務職員. 03 男の事務職員 PIC 9(5). 03 女の事務職員 PIC 9(5). 02 生徒 03 男子生徒 PIC 9(5). 03 女子生徒 PIC 9(5). |
COBOLの記述で、01, 02, 03という数字はレベル番号と言われるもので、データ項目の階層構造
を示しています。01が最上位で、それ以下49まで使うことができます。
01は最上位の階層で、レコードと呼ばれます。
レベル番号の次ぎに記述されているのがデータ名(変数)です。手続き部で使うデータ名(変数)は
全てここで定義されていないといけません。
最後のPIC 9(5) というのはPICTURE句と呼ばれるもので、データの型(文字型、数値型)や桁数を
定義するものです。詳しくは後で説明します。
VALUE はデータ名(変数)に初期値を設定する場合に使います。パソコン用のCOBOLの多くでは
VALUEの記述を省略すると、数値変数では0、文字変数では空白が初期設定されますが、そうしない
仕様のCOBOLもあるので、VALUEも必ず記述しておくのが無難でしょう。
文字の場合は、VALUE "MOJI". のように引用符を用いて記述します。また空白を指定するときは、
VALUE SPACE . のように記述します。
PICTURE句の記述
9 | 数字一文字分 | 5桁の数字を定義する場合は、99999 または9(5) と定義します |
S | +,-の符号 | 最初に符号のついた5桁の数は、S99999, S9(5)と定義する |
V | 想定の小数点位置 | 整数3桁、少数2桁の数は、999V99または9(3)V9(2)と定義する |
X | 文字1文字分(1バイト分) 日本語を入れる場合は、日本語1文字 で2バイト分になるので、Xを2文字分 用意する |
5文字の英数字(1バイト文字)の場合、XXXXXまたはX(5) |
N | 全角文字(2バイト文字)1文字分 | 全角文字5文字の場合、NNNNNまたはN(5) |
2 手続き部
ここにプログラムのコード本体を記述します。基本的な命令をまず覚えましょう。
(1) 入力文 ACCEPT
ACCEPTはキーボードからの入力をする文です。BasicのInputと似た機能です。
書式は以下のようです。キーボードから入力する場合はFROM CONSOLEは省略しても構いません。
ACCEPT 変数 FROM CONSOLE .
標準規格COBOLにはありませんが、拡張された最近のCOBOLではAT指定で、入力位置を画面上の
任意の位置に指定することができます。
ACCEPT NUM AT0515 FROM CONSOLE .
5行目15桁目にカーソル位置を指定し、その位置からデータを入力します。
(2) 出力文 DISPLAY
DISPLAYは画面にデータを出力する文です。Basicのprintと似た機能です。
書式は以下の通りです。画面に出力する場合はUPON COMSOLEを省略しても構いません。
DISPLAY 変数 UPON CONSOLE .
拡張されたCOBOLでは、画面上の表示位置を指定する場合に、AT指定を使うことができます。
(3) COMPUTE
COMPUTEを使って四則演算を行います。
加算 COMPUTE Z = X + Y.
減算 COMPUTE Z = X - Y.
乗算 COMPUTE X = Y * 2.
除算 COMPUTE X = Y / 2.
べき乗 COMPUTE X = Y ** 3.
算術演算子 +, -, *, /, ** や=の左右は空白を1個以上置くことになっています。
(4) 簡単なサンプルプログラム
2つのデータを入力し、足し算した結果を表示する超簡単なプログラムです。
特に説明の必要もないと思いますので、説明は省きます。
* add.cob : IDENTIFICATION DIVISION. PROGRAM-ID. ADD_program. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUM1 PIC 9999 VALUE 0. 01 NUM2 PIC 9999. 01 TOTAL PIC 99999. PROCEDURE DIVISION. DISPLAY SPACE. DISPLAY '**** 足し算 ****'. DISPLAY 'Number1:'. ACCEPT NUM1. DISPLAY 'Number2:'. ACCEPT NUM2. COMPUTE TOTAL = NUM1 + NUM2. DISPLAY 'TOTAL:' TOTAL. STOP RUN. |
実行結果は以下のようになります。
Owner@tsuyoshi /usr/src/htcobol $ ./add **** 足し算 **** Number1: 7 Number2: 21 TOTAL:00028 Owner@tsuyoshi /usr/src/htcobol |